개요
Docker Compose로 애플리케이션을 구성할 때, 원격 서버의 파일 시스템을 컨테이너에 마운트해야 할 일이 종종 있다.
이를 쉽게 처리할 수 있는 여러 방법 중 SSHFS
와 NFS
을 활용하는 방법에 대해 간단하게 기록해 보려고 한다.
SSHFS
SSHFS는 SSH를 통해 원격 파일 시스템을 안전하게 마운트할 수 있는 도구이다.
먼저, SSHFS
를 사용하여 컨테이너 볼륨을 유연하게 관리해보는 방법을 기록해보겠다.
SSHFS 플러그인 설치
도커에서 SSHFS를 사용하려면, 먼저 docker-volume-sshfs
라는 플러그인을 설치해줘야 한다.
docker plugin install vieux/sshfs
도커 컴포즈 설정하기
SSHFS를 사용하려면 docker-compose.yaml
파일에 volumes
를 정의하고 필요한 옵션을 추가해야 한다.
아래는 기본적인 설정 예시이다.
services:
my-app:
image: myapp:latest
volumes:
- my_sshfs_volume:/path/in/container
volumes:
my_sshfs_volume:
driver: vieux/sshfs
driver_opts:
sshcmd: "user@remote-server:/remote/path"
password: "your-ssh-password"
allow_other: "true"
port: "22"
옵션 설명
driver_opts.sshcmd
: SSH 연결 정버와 원격 디렉토리 경로 지정. 형식은user@host:/remote/path
이다.user@192.168.219.10:/nfs/data
driver_opts.password
: 원격 서버의 SSH 비밀번호 입력. 보안을 위해 암호를 환경 변수로 관리하는 것을 권장allow_ather
: 볼륨에 대한 다른 사용자 접근을 허용할지 결정. 기본값은false
임.port
: SSH 연결에 사용할 포트 지정. 파일시스템 서버에 설정된 SSH 포트 번호를 지정해야함.IdentityFile
(선택): SSH 키 파일을 따로 사용하는 경우, 해당 속성의 값에다가 키 파일 경로를 지정해준다.
SSH 키 기반 인증 설정
보안을 강화하려면 비밀번호 대신 SSH 키를 사용하는 것이 더 권장된다.
방법은 다음과 같다.
volumes:
my_sshfs_volume:
driver: vieux/sshfs
driver_opts:
sshcmd: "user@remote-server:/remote/path"
IdentityFile: "/path/to/private/key"
allow_other: "true"
port: "22"
환경 변수를 사용한 보안 강화
비밀번호나 SSH 키 경로를 설정하지 않고, 그냥 환경 변수로 관리하면 보안 및 관리가 용이해진다.
volumes:
my_sshfs_volume:
driver: vieux/sshfs
driver_opts:
sshcmd: "${SSH_USER}@${SSH_HOST}:${SSH_PATH}"
password: "${SSH_PASSWORD}"
NFS
이번에는 NFS(Network File System)을 사용하여 컨테이너 간 데이터를 유연하게 관리해보자.
사전 준비
- NFS가 설치된 서버
- 도커가 설치된 서버에 설치해도 상관 없음. 그러나 NFS용 서버를 따로 분리하여 생성하는 것을 권장함.
NFS 공유 폴더 생성
NFS 서버 준비가 끝났다면, 그 다음으로는 공유 폴더를 생성해야한다.
예를 들어, 서버 주소는 192.168.219.100/24
, 공유 폴더 경로는 /nfs/share/db
, /nfs/share/web
라고 가정하겠다.
NFS가 설치되었다고 가정하고, /etc/exports
파일에 다음과 같이 공유 디렉토리를 명시해주자.
/nfs/share/db *(rw,sync,no_subtree_check,no_root_squash)
/nfs/share/web *(rw,sync,no_subtree_check,no_root_squash)
rw
: 읽기-쓰기 권한 부여sync
: 디스크에 데이터를 즉시 동기화no_root_squash
: 클라이언트의 루트 사용자가 서버에서도 루트 권한을 가지도록 설정
설정 후 변경사항 적용하자.
sudo exportfs -r
sudo systemctl restart nfs-server
도커 컴포즈 설정하기
NFS 공유 디렉토리를 도커 컴포즈의 볼륨으로 연결하기 위해 아래와 같이 도커 컴포즈를 작성해보자.
services:
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- "db-data:/var/lib/mysql"
volumes:
db-data:
driver: local
driver_opts:
type: "nfs"
o: "addr=192.168.219.179,rw,vers=4"
device: ":/nfs/share/db
type: nfs
- NFS 타입의 파일 시스템임을 지정.
o: addr=<NFS_IP>
- NFS 서버의 주소를 지정.
nfsvers=4
- 사용 중인 NFS 버전을 명시. (NFS 서버에 맞게 조정)
device: ":/nfs/share/db"
- 공유 폴더의 경로를 지정
주의사항
참고로 NFS 방법을 사용할 경우,
도커가 실행 중인 호스트 머신에 NFS 클라이언트가 설치되어 있어야 한다.
sudo apt-get install -y nfs-common